# 朴素贝叶斯分类器

"""
朴素贝叶斯分类器是一种高效的分类方法，与线性模型相比，它的训练速度更快，但可能在泛化能力上稍逊一筹。这种效率来自于它对每个特征独立处理的方式，只需从每个特征中提取简单的统计数据来学习参数。scikit-learn提供了三种朴素贝叶斯分类器：
GaussianNB：适用于连续数据。
BernoulliNB：假设数据是二分类的。
MultinomialNB：假设数据是计数数据，如单词在文本中的出现次数。
其中，BernoulliNB和MultinomialNB特别适用于文本数据分类。简而言之，朴素贝叶斯分类器以其计算简便和训练迅速而受到青睐，尽管在某些情况下可能不如线性模型精确。

"""

'''
BernoulliNB 分类器计算每个类别中每个特征不为 0 的元素个数。用一个例子来说明会很容易理解：
'''
import numpy as np

X = np.array([
    [0,1,0,1],
    [1,0,1,1],
    [0,0,0,1],
    [1,0,1,0],

])
y = np.array([0,1,0,1])

# 创建如上的数据
# 下面计算每个类别中的非零元素个数
counts = {}
# np.unique(y) (去重）是使用 NumPy 库中的 unique 函数来处理数组 y，并返回其中的唯一元素。
# 这个函数在数据处理和分析中非常有用，尤其是在需要了解数据集中不同类别或值的情况下。
# 功能和用途：
#   返回唯一元素：np.unique(y) 返回一个包含 y 中所有唯一元素的新数组。这个数组中的元素是按升序排列的.
#   统计类别数量：在分类任务中，y 通常是一个包含类别标签的数组。通过使用 np.unique(y)，可以快速了解数据集中有多少个不同的类别.
#   数据清洗：在数据预处理阶段，可以使用 np.unique 来检查数据中是否存在重复的值或异常值，从而进行相应的数据清洗和处理.

for label in np.unique(y):
    counts[label] = X[y==label].sum(axis=0)
print("Feature counts:\n{}".format(counts))
# Feature counts:
# {np.int64(0): array([0, 1, 0, 2]), np.int64(1): array([2, 0, 2, 1])}

'''
统计数据计算：
    MultinomialNB：计算每个类别中每个特征的平均值。
    GaussianNB：保存每个类别中每个特征的平均值和标准差。
预测过程：
    预测时，将数据点与每个类别的统计数据进行比较，选择最匹配的类别作为预测结果。
预测公式：
    MultinomialNB和BernoulliNB的预测公式形式与线性模型相似，但实际上并不相同。
系数解释：
    朴素贝叶斯模型中的coef_与线性模型中的coef_（权重w）含义不同，因为它们代表的是不同统计数据。
总结来说，尽管MultinomialNB和GaussianNB在计算统计数据时有所不同，
但它们的核心思想是相似的，即通过比较数据点与每个类别的统计数据来做出预测。
同时，需要注意朴素贝叶斯模型中的系数与线性模型中的系数在含义上有所区别。
'''

'''
优点、缺点和参数

参数：
    这两个模型的主要参数是alpha，用于控制模型的平滑化程度，影响模型复杂度。
alpha的作用：
    alpha通过向数据中添加虚拟数据点来实现平滑化，这些虚拟数据点对所有特征都取正值。
    alpha值越大，平滑化越强，模型复杂度越低。
对alpha的鲁棒性：
    模型性能对alpha值的鲁棒性较好，意味着alpha值对模型性能的影响不大，但调整alpha通常能略微提高精度。
应用场景：
    GaussianNB主要用于高维数据。
    MultinomialNB和BernoulliNB广泛用于稀疏计数数据，如文本数据。
    MultinomialNB在大型文档上的性能通常优于BernoulliNB。
优点：
    训练和预测速度快。
    训练过程易于理解。
    对高维稀疏数据效果好。
    对参数鲁棒性好。
缺点：
    与线性模型相比，泛化能力可能稍差。
基准模型：
    朴素贝叶斯模型是一个很好的基准模型，尤其适用于非常大的数据集，因为即使训练线性模型也可能非常耗时。
总结来说，朴素贝叶斯模型因其快速的训练和预测速度、简单的训练过程以及对高维稀疏数据的良好效果而受到青睐，
尤其是在处理大型数据集时。尽管它们的泛化能力可能不如线性模型，但它们仍然是一个有价值的基准模型。
'''










